package com.zhendong.gulimall.product.config;

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 *
 * 重点：搞清楚为什么可以加个配置类让它生效。RedisCacheConfiguration中只有个有参构造，也就是说属性赋值
 * 就是容器中有就可以给它赋值，没有就没办法给它赋值，redisCacheConfiguration这个里面本来有些默认值，可以重写修改
 *
 * @author 孟享广
 * @date 2021-01-13 10:05 上午
 * @description  整合Spring Cache 的相关配置
 */

//绑定配置文件的配置
@EnableConfigurationProperties(CacheProperties.class)
//开启缓存功能
@EnableCaching
@Configuration
public class MyCacheConfig {

//    @Autowired
//    CacheProperties cacheProperties;
//
//    放进容器中之后就可以在容器中用它了，这是第一种方法，第二种更简单的就是在方法种直接把它传过来，会自动的扫描它就可以改成54行的代码


    /**
     * 没有用上配置文件中的东西
     * 1）、原来和配置文件绑定配置类是这样子的
     *     @ConfigurationProperties(prefix = "spring.cache")
     *     public class CacheProperties {}
     * 2)、要让他生效就是加个下面的注解，意思是让CacheProperties这个类的配置生效【为什么没有生效因为CacheProperties没有在容器中】
     *      @EnableConfigurationProperties(CacheProperties.class)
     * @return
     */
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {   //CacheProperties方法中的所有参数都会从容器中拿，这里写了有参构造就不用写@Autowired了

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
//        config = config.entryTtl();
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));   //key的序列化器还是用默认这个
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));   //value的序列化器就找个和json有关的

        //将配置文件中的所有配置都生效
        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        return config;
    }
}
